package cn.tedu.knows.portal.controller;

import cn.tedu.knows.portal.exception.ServiceException;
import cn.tedu.knows.portal.service.IUserService;
import cn.tedu.knows.portal.vo.RegisterVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@RestController
//lombok提供的一个记录日志用的注解
//一旦在类上添加@slf4j,这个类的方法就可以使用log对象记录日志
@Slf4j
public class SystemController {
    @Autowired
    private IUserService userService;
    @PostMapping("/register")
    public String register(@Validated RegisterVo registerVo, BindingResult result){
        //RegisterVo 参数前添加Validated表示开启服务器端验证功能
        //当控制器方法运行之前,SpringValidation框架会按RegisterVo中编写的规则进行验证
        //这个参数必须紧随RegisterVo之后
        //result 中包含RegisterVo的验证结果

        //利用日志对象,将接受到的信息输出到控制台
        log.debug("接受到用户信息:{}",registerVo);
        if (result.hasErrors()){
            String msg=result.getFieldError().getDefaultMessage();
            return msg;
        }
           userService.registerStudent(registerVo);
           return "ok";
    }

    //获取application.properties配置的信息
    @Value("${knows.resource.path}")
    private File resourcePath;

    @Value("${knows.resource.host}")
    private String resourceHost;

    @PostMapping("/upload/file")
    //MultipartFile是SpringMVC提供的类,专门用于接收上传的文件
    public String uploadFile(MultipartFile imageFile) throws IOException {
        //根据日期设置文件夹路径
        String path = DateTimeFormatter.ofPattern("yyyy/MM/dd")
                .format(LocalDate.now());
        File folder = new File(resourcePath,path);
        folder.mkdirs();
        //随机文件名
        String fileName = imageFile.getOriginalFilename();
        String ext= fileName.substring(fileName.lastIndexOf("."));
        String name  = UUID.randomUUID().toString()+ext;
        File file = new File(folder,name);
        log.debug("上传的路径为:"+file.getAbsolutePath());
        imageFile.transferTo(file);
        // 回显的关键,是上传控制返回通过静态资源服务器访问资源的路径
        String url = resourceHost+"/"+path+"/"+name;
        log.debug("生成的Url,"+url);
        //返回url,以实现页面的回显上传的图片
        return url;
    }
}
